/**
 * 性能数据管理模块，符合PerformanceEntry相关规范
 */
class PerformanceEntry {
  /**
   * 性能数据条目基础类
   * @param {Object} options - 性能条目参数
   * @param {string} options.name - 条目标识名称
   * @param {string} options.entryType - 条目类型
   * @param {number} options.startTime - 开始时间(ms)
   * @param {number} options.duration - 持续时间(ms)
   * @param {Object} [options.data] - 附加数据
   */
  constructor(options) {
    // 验证必填参数
    if (!options.name || !options.entryType || typeof options.startTime !== 'number') {
      throw new Error('PerformanceEntry requires name, entryType and startTime');
    }
    
    this.name = options.name;
    this.entryType = options.entryType;
    this.startTime = options.startTime;
    this.duration = options.duration || 0;
    this.data = options.data || {};
    this.id = options.id || Date.now().toString(36) + Math.random().toString(36).substr(2, 5);
  }
}

const EntryList = {
  // 存储所有性能数据条目
  _entries: [],
  
  /**
   * 添加性能数据条目
   * @param {Object} entryOptions - 性能条目参数
   * @returns {PerformanceEntry} 添加的条目
   */
  addEntry(entryOptions) {
    try {
      const entry = new PerformanceEntry(entryOptions);
      this._entries.push(entry);
      return entry;
    } catch (error) {
      console.error('Failed to add entry:', error);
      throw error;
    }
  },
  
  /**
   * 获取所有性能数据条目
   * @returns {Array.<PerformanceEntry>} 性能数据条目数组
   */
  getEntries() {
    // 返回副本，避免外部直接修改内部数据
    return [...this._entries];
  },
  
  /**
   * 根据名称和类型获取性能数据条目
   * @param {string} name - 要匹配的名称
   * @param {string} [entryType] - 要匹配的类型（可选）
   * @returns {Array.<PerformanceEntry>} 匹配的性能数据条目数组
   */
  getEntriesByName(name, entryType) {
    if (typeof name !== 'string') {
      throw new Error('name must be a string');
    }
    
    return this._entries.filter(entry => {
      // 名称精确匹配
      const nameMatches = entry.name === name;
      
      // 类型匹配（如果提供了类型参数）
      const typeMatches = entryType ? entry.entryType === entryType : true;
      
      return nameMatches && typeMatches;
    });
  },
  
  /**
   * 根据类型获取性能数据条目
   * @param {string} entryType - 要匹配的类型
   * @returns {Array.<PerformanceEntry>} 匹配的性能数据条目数组
   */
  getEntriesByType(entryType) {
    if (typeof entryType !== 'string') {
      throw new Error('entryType must be a string');
    }
    
    return this._entries.filter(entry => entry.entryType === entryType);
  },
  
  /**
   * 清空所有性能数据条目
   */
  clearEntries() {
    this._entries = [];
  },
  
  /**
   * 获取条目总数
   * @returns {number} 条目数量
   */
  getEntryCount() {
    return this._entries.length;
  }
};

module.exports = EntryList;
